package com.bw.lib_base

import android.app.Application
import android.content.Context
import android.util.Log
import androidx.startup.Initializer
import com.alibaba.android.arouter.launcher.ARouter
import com.sankuai.waimai.router.Router
import com.sankuai.waimai.router.common.DefaultRootUriHandler
import com.sankuai.waimai.router.components.DefaultLogger
import com.sankuai.waimai.router.core.Debugger
import com.tencent.mmkv.BuildConfig
import com.tencent.mmkv.MMKV
import kotlinx.coroutines.*

/**
 * SDK初始化器
 */
class SdkInitializer: Initializer<Unit> {
    //自定义初始化第三方sdk的协程作用域
    private val mInitSDKCoroutineScope= CoroutineScope(Dispatchers.IO + SupervisorJob())

    override fun create(context: Context) {
        mInitSDKCoroutineScope.launch {
            //执行多个初始化任务
            val allInitTask = listOf(
                async {initMMKV(context)},
                async {initARouter(context)},
                async {initWmRouter(context)},
                async {initRoom()}
            )

            //等待所有的执行结果(所有初始化任务返回)
            val result = allInitTask.awaitAll()
            Log.i("aaa", "所有初始化已完成")

        }
    }

    private suspend fun initMMKV(context: Context){
        withContext(Dispatchers.IO){
            //MMKV初始化
            val filePath = MMKV.initialize(context)
            Log.i("aaa", "initMMKV完成，路径: ${filePath}")
        }
    }

    private suspend fun initARouter(context: Context){
        withContext(Dispatchers.IO){
            //初始化ARouter
            if(BuildConfig.DEBUG){
                ARouter.openLog()
                ARouter.openDebug()
            }
            ARouter.init(context as Application)
            Log.i("aaa", "initARouter: ARouter初始化完成")
        }
    }

    private suspend fun initWmRouter(context: Context){
        withContext(Dispatchers.IO){
            Router.init(DefaultRootUriHandler(context))
            Log.i("aaa", "initWmRouter:初始化成功")

            // 设置Logger
            Debugger.setLogger(object: DefaultLogger(){
                override fun handleError(t: Throwable?) {
                    super.handleError(t)
                    //处理异常
                }
            });

            if(BuildConfig.DEBUG){
                // Log开关，建议测试环境下开启，方便排查问题。
                Debugger.setEnableLog(true);
                // 调试开关，建议测试环境下开启。调试模式下，严重问题直接抛异常，及时暴漏出来。
                Debugger.setEnableDebug(true);
            }
        }
    }


    private suspend fun initRoom(){
        withContext(Dispatchers.IO){
        }
    }


    /**
     * 需要依赖其它初始化器
     */
    override fun dependencies(): List<Class<out Initializer<*>>> {
        return emptyList()
    }
}